ジョブスケジューラ「Rundeck」を試してみる
森永です。
最近は大逆転裁判をやりながら寝落ちするという毎日を送っています。
サーバ構築する上で、ジョブをどうするかというのは考慮が必要な点です。
簡単に実現するにはcronを使えばいいのですが、要件によってはジョブスケジューラを使わないと厳しいということがあります。
かと言って、エンタープライズで使われている本格的なジョブスケジューラを使うのも大げさすぎる、というのもわかります。
そこで今回は、簡単に構築ができてそれなりに痒いところには手が届くジョブスケジューラ「Rundeck」を試してみます。
Rundeckとは
OSSのジョブスケジューラです。
特徴として以下の様なものがあげられます。
エージェントレス
SSH接続できればジョブを実行できます。
なので、別サブネットはもちろん、別VPCでも別AWSアカウントでもはたまたオンプレでもRundeckサーバからSSH接続とジョブを実行できるユーザさえいれば大丈夫です!
ジョブネットを作成可能
ジョブAが正常に終わらないとジョブBを実行したくないと言った所謂、依存関係を設定できます。
cronと同様の記述が可能
商用ジョブスケジューラだとジョブを定義するためにいろいろ設定を書く必要がありますが、cronと全く同じ記述が可能です。
cronで動かしているものを単純移行も比較的容易に可能です。
失敗時の通知、再実行が可能
これだけでもcronから移行する価値があるかと思います。
単純に失敗したら通知するだけでも便利です。
Rundeckを試してみる
RundeckはJavaベースでLinuxでもWindowsでもMacでも動きます。
今回はLinuxに導入してみます。
どのディストリビューションに対応しているかですが、インストールガイドにLinux: Most recent distributions are likely to workとあります。
最新のディストリビューションなら大概動くぽいです。今回はAmazon Linuxで行きます。
また、Javaのバージョンですが、1.7以上であればOpen JDKでもOracle JDKでも構いません。
いろいろなインストール方法がありますが、楽したいのでRPMからポチーっです。
# yum install java-1.7.0 # rpm -Uvh http://repo.rundeck.org/latest.rpm # yum install rundeck # service rundeckd start
はい。インストール終了です。
これでブラウザからRundeckにアクセスできるようになるのですが、少し設定を行います。
/etc/rundeck/rundeck-config.properties
の設定を変更します。
grails.serverURLを正しく設定しないとアクセスしてもlocalhostにふっとばされてうまくいきません。
$ vi /etc/rundeck/rundeck-config.properties #loglevel.default is the default log level for jobs: ERROR,WARN,INFO,VERBOSE,DEBUG loglevel.default=INFO rdeck.base=/var/lib/rundeck #rss.enabled if set to true enables RSS feeds that are public (non-authenticated) rss.enabled=false # change hostname here grails.serverURL=http://<RundeckサーバのIP or ホスト名>:4440 dataSource.dbCreate = update dataSource.url = jdbc:h2:file:/var/lib/rundeck/data/rundeckdb;MVCC=true;TRACE_LEVEL_FILE=4
これで設定も完了です。
ブラウザからアクセスします。
Rundeckのウェブコンソールのデフォルトポートは4440ですので、セキュリティグループの開放もしておきましょう。
ユーザ名admin、初期パスワードadminでログインするとWelcomeされます。
プロジェクトを作成します。
「Project Name」と「Default Node Executor」を設定するだけです。
今回はSSHで実行しますので、公開鍵を配置するディレクトリを指定します。(デフォルトでいきます)
プロジェクトが出来ましたので、早速ジョブを作成していきましょう。
Rundeckサーバのローカル実行とリモート実行で少し手順が違います。
ローカルサーバでの実行
まずはRundeckサーバのローカルで実行してみます。
「Job Name」と「Description」を入力します。
「Description」にはMarkdownを使うことが出来ますので、ジョブの詳細をわかりやすく記述しましょう。
ジョブのステップを設定します。
「If a step fails...」は失敗時の挙動、「Strategy...」は複数サーバ複数ステップ実行時の挙動を選択できます。
「Command」をステップとして登録してみましょう。
「Command」と「Step Description」を設定します。
複数ステップを一つのジョブに設定することも可能です。
「Nodes」で「Execute locally」を選択することでRundeckサーバのローカルで実行できます。
「Send Notification?」は設定することで、ジョブ成功時、失敗時、開始時にメールを送信することが出来ます。
ただし、メールの送信にはSMTPサーバの設定が必要です。
「Schedule to run repeadedly?」を設定することで定期ジョブを設定できます。
「Simple」と「Crontab」の2つの記法で設定できます。
「Crontab」を使えば慣れ親しんだCronの設定をそのまま使用できます。
他にも色々設定できますが、ひとまずデフォルトで行きましょう。
さあ、「Run Job Now」で即時実行しますよ!
ジョブの内容が内容なので一瞬で終わりましたが、無事終わったようです。ε-(´∀`*)ホッ
最初に表示されているのは「Summary」タブです。
いくつのノードで成功、失敗、未完了、未開始なのか一覧になっています。
「Report」タブを見ると各ノードの各ステップの結果をざっと見できます。
「Log Output」タブでは、出力の結果を確認できます。
リモートサーバでの実行
次に、リモートサーバで実行してみます。
ジョブを実行するサーバにRundeckサーバからSSHアクセスできるようにする必要があります。
プロジェクト作成時にSSHキーの場所を指定していましたので覗いてみましょう。
デフォルトだと/var/lib/rundeck/.ssh/id_rsaとなっていました。
# ll /var/lib/rundeck/.ssh/ total 8 -rw------- 1 rundeck rundeck 1679 Aug 27 10:31 id_rsa -rw-r--r-- 1 rundeck rundeck 382 Aug 27 10:31 id_rsa.pub
公開鍵と秘密鍵があります。
公開鍵をジョブを実行したいサーバにRundeckユーザを作成し配置します。
# useradd rundeck # su - rundeck $ mkdir /home/rundeck/.ssh $ chmod 700 /home/rundeck/.ssh $ vi /home/rundeck/.ssh/authorized_keys $ chmod 600 /home/rundeck/.ssh/authorized_keys
ノードの追加はWEB上からは出来ず、Rundeckサーバの/var/rundeck/projects/プロジェクト名/etc/resources.xmlを編集して追加します。
# vi /var/rundeck/projects/rundeck-test/etc/resources.xml <?xml version="1.0" encoding="UTF-8"?> <project> <node name="localhost" description="Rundeck server node" tags="" hostname="localhost" osArch="amd64" osFamily="unix" osName="Linux" osVersion="3.14.35-28.38.amzn1.x86_64" username="rundeck"/> <node name="remote" description="Remote Server node" tags="" hostname="IPアドレス or ホスト名" osArch="amd64" osFamily="unix" osName="Linux" osVersion="CentOS 7 x86_64" username="rundeck"/> </project>
username="rundeck"という指定があるので、こちらを変更すれば実行ユーザを変更可能です。
osArchやosFamilyなどは実行サーバを指定するときに使用しますので、同じものであれば同じ値にしましょう。(厳密な値である必要はなさそうです。)
ノードの追加が完了したので、ジョブを作成しましょう。
テストなのでローカル実行したジョブをコピーして使っちゃいましょー。
ローカルジョブの「Action」→「Duplicate this Job」を選択します。
変更するのは「Nodes」の部分だけです。
「Dispatch to Nodes」を選択し、先ほど追加したノード名を「filter」に入力します。
「filter」にはOS名なども設定できます。
実行してみます。
リモート環境でもうまいこと行きました!!
さいごに
個人的には非常に直感的に設定できて使いやすいジョブスケジューラでした。
他にも色々設定できそうなのでいじくってみます。
前職でお客さんに「cronとジョブスケジューラはどう使い分ける?」と質問されたのを思い出しました。。。
いい思い出です。